import axios from 'axios'
import { ElMessage } from 'element-plus'
import { getApiConfig, corsConfig, validateCorsConfig } from '@/config/cors'

// 验证跨域配置
validateCorsConfig()

// 获取 API 配置
const apiConfig = getApiConfig()

// 创建axios实例
const api = axios.create({
  baseURL: apiConfig.baseURL,
  timeout: apiConfig.timeout,
  headers: apiConfig.headers
})

// 请求拦截器
api.interceptors.request.use(
  (config) => {
    // 添加token到请求头
    const token = localStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    
    // 添加跨域相关请求头
    config.headers['X-Requested-With'] = 'XMLHttpRequest'
    
    // 添加 CSRF Token（如果启用）
    if (corsConfig.security.csrf.enabled) {
      const csrfToken = localStorage.getItem('csrf-token')
      if (csrfToken) {
        config.headers[corsConfig.security.csrf.headerName] = csrfToken
      }
    }
    
    // 防止缓存 - GET请求添加时间戳
    if (config.method === 'get') {
      config.params = {
        _t: Date.now(),
        ...config.params
      }
    }
    
    // 开发环境打印请求信息
    if (corsConfig.base.debug) {
      console.log('🚀 Request:', config.method?.toUpperCase(), config.url, config.data || config.params)
    }
    
    // 添加额外的调试信息
    console.log('📤 请求URL:', config.baseURL + config.url)
    console.log('📤 请求方法:', config.method?.toUpperCase())
    console.log('📤 请求头:', config.headers)
    console.log('📤 请求数据:', config.data)
    
    return config
  },
  (error) => {
    console.error('❌ Request Error:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
api.interceptors.response.use(
  (response) => {
    // 开发环境打印响应信息
    if (corsConfig.base.debug) {
      console.log('✅ Response:', response.status, response.data)
    }
    
    // 添加额外的调试信息
    console.log('📥 响应状态:', response.status)
    console.log('📥 响应头:', response.headers)
    console.log('📥 响应数据:', response.data)
    
    // 解构后端标准响应格式
    const { code, data, message } = response.data
    
    // 200为成功状态码（根据实际API调整）
    if (code !== undefined) {
      if (code === 200) {
        return data
      } else {
        ElMessage.error(message || '请求失败')
        return Promise.reject(new Error(message || '请求失败'))
      }
    }
    
    // 如果后端直接返回数据
    return response.data
  },
  (error) => {
    console.error('❌ Response Error:', error)
    
    // 添加额外的调试信息
    if (error.response) {
      console.error('📥 错误响应状态:', error.response.status)
      console.error('📥 错误响应头:', error.response.headers)
      console.error('📥 错误响应数据:', error.response.data)
    }
    
    // 统一错误处理
    if (error.response?.status === 401) {
      console.error('登录过期，请重新登录')
      ElMessage.error('登录已过期，请重新登录')
      // 清除用户信息
      localStorage.removeItem('token')
      localStorage.removeItem('userInfo')
      localStorage.removeItem('isLogin')
      // 跳转登录页
      if (corsConfig.errorHandling.autoRedirectOn401) {
        window.location.href = '/login'
      }
    } else if (error.code === 'ECONNABORTED') {
      ElMessage.error('请求超时，请稍后重试')
    } else if (error.response) {
      const { status, data } = error.response
      const errorMessage = corsConfig.errorHandling.showDetailedError 
        ? (data?.message || `请求失败 (${status})`)
        : '请求失败，请稍后重试'
      ElMessage.error(errorMessage)
    } else {
      ElMessage.error('网络连接失败，请检查网络设置')
    }
    
    return Promise.reject(error.message || '请求失败')
  }
)

// 开发环境启用 Mock（已禁用，使用真实后端数据）
// if (corsConfig.base.env === 'development' && corsConfig.base.mockEnabled) {
//   import('@/mock').then(({ setupMock }) => {
//     setupMock(api)
//     console.log('🎭 Mock 适配器已启动，拦截模式已启用')
//   }).catch(err => {
//     console.warn('⚠️ Mock 加载失败，请检查依赖是否安装:', err)
//   })
// }

// 使用真实后端数据
console.log('🌐 使用真实后端数据，Mock 已禁用')

// 导出axios实例
export default api

// 导出常用的HTTP方法
export const http = {
  get: (url, params) => api.get(url, { params }),
  post: (url, data) => api.post(url, data),
  put: (url, data) => api.put(url, data),
  patch: (url, data) => api.patch(url, data),
  delete: (url) => api.delete(url),
  // 文件上传
  upload: (url, file, onProgress) => {
    const formData = new FormData()
    formData.append('file', file)
    return api.post(url, formData, {
      headers: {
        'Content-Type': 'multipart/form-data'
      },
      onUploadProgress: onProgress
    })
  }
} 